#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
新闻日报生成器
整合RSS新闻获取、AI分析和邮件发送功能
"""

from rss_news import RSSNewsFetcher
from chat_client import ChatClient
from email_sender import create_qq_email_sender
from config import API_CONFIG, SYSTEM_PROMPTS
from datetime import datetime
import logging
from typing import Dict, Optional


class NewsDailyGenerator:
    """新闻日报生成器"""
    
    def __init__(self, 
                 rss_url: str = "https://rss.aishort.top/?type=36kr",
                 sender_email: str = None,
                 sender_password: str = None,
                 recipient_email: str = "505735255@qq.com"):
        """
        初始化新闻日报生成器
        
        Args:
            rss_url: RSS新闻源地址
            sender_email: 发送邮箱
            sender_password: 发送邮箱密码/授权码
            recipient_email: 接收邮箱
        """
        self.rss_url = rss_url
        self.recipient_email = recipient_email
        
        # 初始化组件
        self.news_fetcher = RSSNewsFetcher()
        self.chat_client = ChatClient(
            api_key=API_CONFIG["api_key"],
            base_url=API_CONFIG["base_url"],
            model=API_CONFIG["model"]
        )
        
        # 初始化邮件发送器
        if sender_email and sender_password:
            self.email_sender = create_qq_email_sender(sender_email, sender_password)
        else:
            self.email_sender = None
        
        # 设置日志
        self._setup_logging()
    
    def _setup_logging(self):
        """设置日志记录"""
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s - %(levelname)s - %(message)s',
            handlers=[
                logging.FileHandler('news_daily.log', encoding='utf-8'),
                logging.StreamHandler()
            ]
        )
        self.logger = logging.getLogger(__name__)
    
    def generate_daily_report(self, max_news_items: int = 8) -> Dict:
        """
        生成每日新闻报告
        
        Args:
            max_news_items: 最大新闻条目数
            
        Returns:
            包含新闻数据和AI分析的字典
        """
        self.logger.info("开始生成每日新闻报告...")
        
        try:
            # 1. 获取RSS新闻
            self.logger.info(f"正在获取RSS新闻: {self.rss_url}")
            news_data = self.news_fetcher.fetch_rss_news(self.rss_url, max_news_items)
            
            if 'error' in news_data:
                self.logger.error(f"获取新闻失败: {news_data['error']}")
                return {'error': news_data['error']}
            
            self.logger.info(f"成功获取 {len(news_data['items'])} 条新闻")
            
            # 2. 生成AI分析
            self.logger.info("正在生成AI分析...")
            ai_analysis = self._generate_ai_analysis(news_data)
            
            # 3. 构建报告
            report = {
                'news_data': news_data,
                'ai_analysis': ai_analysis,
                'generated_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                'total_items': len(news_data['items'])
            }
            
            self.logger.info("每日新闻报告生成完成")
            return report
            
        except Exception as e:
            self.logger.error(f"生成报告时发生错误: {e}")
            return {'error': str(e)}
    
    def _generate_ai_analysis(self, news_data: Dict) -> str:
        """
        生成AI分析内容
        
        Args:
            news_data: 新闻数据
            
        Returns:
            AI分析内容
        """
        try:
            # 构建分析提示词
            news_titles = [item['title'] for item in news_data['items']]
            news_summaries = []
            
            for item in news_data['items'][:5]:  # 只分析前5条
                summary = f"标题: {item['title']}"
                if item.get('description'):
                    # 限制描述长度为120字
                    desc = item['description'][:120]
                    if len(item['description']) > 120:
                        desc += "..."
                    summary += f"\n摘要: {desc}"
                news_summaries.append(summary)
            
            analysis_prompt = f"""请分析以下今日新闻，提供简洁的日报分析：

新闻标题列表：
{chr(10).join([f"- {title}" for title in news_titles])}

新闻摘要：
{chr(10).join([f"{i+1}. {summary}" for i, summary in enumerate(news_summaries)])}

请提供简洁分析（总字数控制在300字以内）：
1. 📊 今日热点总结（50字）
2. 🔍 重要趋势分析（100字）
3. 💡 商业机会洞察（100字）
4. 🌟 关注要点（50字）

请用简洁、专业的语调，重点突出。"""
            
            # 使用AI生成分析
            analysis = self.chat_client.simple_chat(
                analysis_prompt,
                SYSTEM_PROMPTS["assistant"]
            )
            
            return analysis
            
        except Exception as e:
            self.logger.error(f"生成AI分析时发生错误: {e}")
            return f"AI分析生成失败: {e}"
    
    def send_daily_report(self, report: Dict = None) -> bool:
        """
        发送每日新闻报告
        
        Args:
            report: 新闻报告，如果为None则重新生成
            
        Returns:
            发送是否成功
        """
        if not self.email_sender:
            self.logger.error("邮件发送器未配置")
            return False
        
        try:
            # 如果没有提供报告，则生成新的
            if report is None:
                self.logger.info("未提供报告，正在生成新的日报...")
                report = self.generate_daily_report()
            
            if 'error' in report:
                self.logger.error(f"报告生成失败: {report['error']}")
                return False
            
            # 发送邮件
            self.logger.info(f"正在发送日报至 {self.recipient_email}")
            success = self.email_sender.send_news_daily(
                to_email=self.recipient_email,
                news_data=report['news_data'],
                ai_analysis=report['ai_analysis']
            )
            
            if success:
                self.logger.info("日报发送成功")
            else:
                self.logger.error("日报发送失败")
            
            return success
            
        except Exception as e:
            self.logger.error(f"发送日报时发生错误: {e}")
            return False
    
    def generate_and_send_daily(self, max_news_items: int = 8) -> bool:
        """
        生成并发送每日新闻报告
        
        Args:
            max_news_items: 最大新闻条目数
            
        Returns:
            操作是否成功
        """
        self.logger.info("开始生成并发送每日新闻报告...")
        
        # 生成报告
        report = self.generate_daily_report(max_news_items)
        
        if 'error' in report:
            self.logger.error(f"报告生成失败: {report['error']}")
            return False
        
        # 发送报告
        return self.send_daily_report(report)
    
    def preview_daily_report(self, max_news_items: int = 5) -> str:
        """
        预览每日新闻报告（不发送邮件）
        
        Args:
            max_news_items: 最大新闻条目数
            
        Returns:
            报告预览内容
        """
        report = self.generate_daily_report(max_news_items)
        
        if 'error' in report:
            return f"报告生成失败: {report['error']}"
        
        # 构建预览内容
        preview = f"""
📰 新闻日报预览 - {datetime.now().strftime('%Y年%m月%d日')}
{'=' * 60}

📊 新闻统计:
- 来源: {report['news_data']['title']}
- 总条目数: {report['news_data']['total_items']}
- 精选条目: {len(report['news_data']['items'])}
- 生成时间: {report['generated_at']}

📰 今日要闻:
{'=' * 60}
"""
        
        for i, item in enumerate(report['news_data']['items'], 1):
            preview += f"""
{i}. {item['title']}
   📅 时间: {item.get('published', '未知时间')}
   🔗 链接: {item.get('link', '无链接')}
   📝 内容: {item.get('description', '暂无描述')[:150]}...
"""
        
        preview += f"""

🤖 AI智能分析:
{'=' * 60}
{report['ai_analysis']}

{'=' * 60}
"""
        
        return preview


def main():
    """主函数 - 测试新闻日报生成"""
    print("=== 新闻日报生成器测试 ===")
    
    # 创建生成器（不配置邮件发送器，只测试生成功能）
    generator = NewsDailyGenerator()
    
    # 预览日报
    print("1. 生成日报预览:")
    print("-" * 40)
    preview = generator.preview_daily_report(5)
    print(preview)
    
    # 测试完整流程（如果有邮件配置）
    print("\n2. 测试完整流程:")
    print("-" * 40)
    print("如需测试邮件发送，请配置邮箱信息后运行:")
    print("generator = NewsDailyGenerator(")
    print("    sender_email='your_email@qq.com',")
    print("    sender_password='your_auth_code'")
    print(")")
    print("generator.generate_and_send_daily()")


if __name__ == "__main__":
    main()
